unit halfmin;
interface

uses
Windows, Messages, SysUtils, Classes, Graphics, 
Controls, Forms, Dialogs, ExtCtrls;

type

TTimeEvent = procedure(Sender: TObject;
                                             TheTime: TDateTime) of object;

TddgHalfMinute = class(TComponent)
private
	FTimer: TTimer;
	FOnHalfMinute: TTimeEvent;
     
	FOldSecond, FSecond: Word;  

	procedure FTimerTimer(Sender: TObject);

protected
	procedure DoHalfMinute(TheTime: TDateTime);
                                                                                     dynamic;
public
	constructor Create(AOwner: TComponent); override;
	destructor Destroy; override;

published
	property OnHalfMinute: TTimeEvent 
           read FOnHalfMinute write FOnHalfMinute;
end;

implementation

constructor TddgHalfMinute.Create(AOwner: TComponent);
begin

inherited Create(AOwner);
if not (csDesigning in ComponentState) then
begin
FTimer := TTimer.Create(self);
FTimer.Enabled := True;
FTimer.Interval := 500;   
FTimer.OnTimer := FTimerTimer;
end;
end;

destructor TddgHalfMinute.Destroy;
begin
FTimer.Free;  
inherited Destroy;
end;

procedure TddgHalfMinute.FTimerTimer(Sender: TObject);
var
DT: TDateTime;
Temp: Word;
begin
DT := Now; 
FOldSecond := FSecond;

DecodeTime(DT, Temp, Temp, FSecond, Temp);

if FSecond <> FOldSecond then
	if ((FSecond = 30) or (FSecond = 0)) then
			DoHalfMinute(DT)
end;

procedure TddgHalfMinute.DoHalfMinute(
                                            TheTime: TDateTime);
begin
	if Assigned(FOnHalfMinute) then
				FOnHalfMinute(Self, TheTime);
end;

end.
procedure TForm1.Edit1KeyPress(Sender: TObject; 
                                                                var Key: Char);
begin
end;
